#ifndef __DUNE_BOUNDARY_HH__
#define __DUNE_BOUNDARY_HH__
#include <string>
#include <map>
#include <dune/common/parametertreeparser.hh>
#include <dune/initial/initial.hh>
namespace Dune {
  namespace Boundary {
    class Boundary {
    public:
      Boundary();
      virtual ~Boundary();
      void parser_flags(Dune::ParameterTree& ptree);
      template<typename INIT>
      void bind_initial_condition(INIT& init); // use initial condiction to set fixed boundary
      void set_bouncond_paras(Dune::ParameterTree& ptree);
      void set_bouncond_para(std::string key, double value);
      // five types of boundary condition 
      void fixed_boundary(double* location, double* holder);
      void driven_boundary(double t, double* location, double* holder);
      void typical_boundary(); // TODO - typical doundaries deduced from interior
      void composite_boundary(); // TODO - combine domains
      void internal_boundary(); // TODO
    private:
      void const_boun(); // TODO
      void zero_boun(); // TODO
      std::map<std::string,char> flags;
      std::map<std::string,double> para;
      Dune::Initial::InitialBase* init; 
    };
  } // BoundaryFactory
} // Dune
#endif  // __DUNE_BOUNDARY_HH__
